package com.br.sc.vendas.activity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockActivity;
import com.br.sc.vendas.modelo.Cliente;
import com.br.sc.vendas.modelo.Pedido;
import com.br.sc.vendas.modelo.Tipo;
import com.br.sc.vendas.util.AndrettaUtil;

public class CadastroPedidosActivity extends SherlockActivity implements OnClickListener
{
	@SuppressWarnings ( "unused" )
	private Cliente cliente = null;
	private int id = 0;
	private String date = "";
	private AutoCompleteTextView txtNomeCliente;
	private Spinner cbTipo;
	private List<String> tipos;
	private TextView lbTelefone;
	private TextView lbCidade;
	private TextView lbCampo1;
	private TextView lbCampo2;
	private TextView lbCampo3;
	private EditText txtCampo1;
	private EditText txtCampo2;
	private EditText txtCampo3;
	private EditText txtTraco;
	private EditText txtValor;
	private TextView lbTotalPedido;

	@Override
	protected void onCreate ( Bundle savedInstanceState )
	{
		super.onCreate( savedInstanceState );
		setContentView( R.layout.activity_cadastropedido );

		findViewById( R.cadastroPedido.btSalvarPedido ).setOnClickListener( this );
		findViewById( R.cadastroPedido.btNovoPedido ).setOnClickListener( this );
		this.txtNomeCliente = ( AutoCompleteTextView ) findViewById( R.cadastroPedido.txtNomeCliente );
		this.cbTipo = ( Spinner ) findViewById( R.cadastroPedido.cbTipo );
		this.lbTelefone = ( TextView ) findViewById( R.cadastroPedido.lbTelefone );
		this.lbCidade = ( TextView ) findViewById( R.cadastroPedido.lbCidade );
		this.lbTotalPedido = ( TextView ) findViewById( R.cadastroPedido.lbTotalPedido );
		this.lbCampo1 = ( TextView ) findViewById( R.cadastroPedido.lbCampo1 );
		this.lbCampo2 = ( TextView ) findViewById( R.cadastroPedido.lbCampo2 );
		this.lbCampo3 = ( TextView ) findViewById( R.cadastroPedido.lbCampo3 );
		this.txtCampo1 = ( EditText ) findViewById( R.cadastroPedido.txtCampo1 );
		this.txtCampo2 = ( EditText ) findViewById( R.cadastroPedido.txtCampo2 );
		this.txtCampo3 = ( EditText ) findViewById( R.cadastroPedido.txtCampo3 );
		this.txtTraco = ( EditText ) findViewById( R.cadastroPedido.txtTraco );
		this.txtValor = ( EditText ) findViewById( R.cadastroPedido.txtValor );

		setaCombo( );
		mudaTela( );
		selecionaCliente( );
		AndrettaUtil.setaAutoCompleteCliente( CadastroPedidosActivity.this, this.txtNomeCliente );

		Pedido pedido = ( Pedido ) getIntent( ).getSerializableExtra( "pedido" );

		if ( pedido != null )
		{
			this.id = pedido.getId( );
			this.cliente = pedido.getCliente( );
			this.txtNomeCliente.setText( pedido.getCliente( ).getNome( ) );
			this.lbTelefone.setText( pedido.getCliente( ).getTelefone( ) );
			this.lbCidade.setText( pedido.getCliente( ).getCidade( ).getNome( ) );
			this.cbTipo.setSelection( pedido.getTipo( ).ordinal( ) );
			this.txtCampo1.setText( pedido.getCampo1( ).toString( ) );
			this.txtCampo2.setText( pedido.getCampo2( ).toString( ) );
			this.txtCampo3.setText( pedido.getCampo3( ).toString( ) );
			this.lbTotalPedido.setText( "" + pedido.getTotalPedido( ) );
			this.date = AndrettaUtil.toString( pedido.getData( ) );
			this.txtTraco.setText( pedido.getTraco( ).toString( ) );
			this.txtValor.setText( pedido.getValor( ).toString( ) );
			mudaTela( );
		}
		else
			mudaTela( );

		txtCampo3.setOnFocusChangeListener( new OnFocusChangeListener( ) {

			public void onFocusChange ( View v , boolean perdeuFoco )
			{
				if ( !perdeuFoco )
				{
					lbTotalPedido.setText( getTotalPedido( ).toString( ) );
				}
			}
		} );

	}

	private Double getTotalPedido ( )
	{
		final Double campo1 = getCampo( this.txtCampo1 );
		final Double campo2 = getCampo( this.txtCampo2 );
		final Double campo3 = getCampo( this.txtCampo3 );

		if ( Integer.parseInt( "" + cbTipo.getSelectedItemId( ) ) == Tipo.LAJE_VIGAS.ordinal( ) )
			return ( campo1 * campo2 * campo3 );
		else
			return ( campo1 * ( campo2 * campo2 ) * campo3 );
	}

	public void onClick ( View v )
	{
		if ( v.getId( ) == R.cadastroPedido.btSalvarPedido ) salva( );
		if ( v.getId( ) == R.cadastroPedido.btNovoPedido ) novoItem( );
	}

	private void setaCombo ( )
	{
		this.tipos = new ArrayList<String>( );
		this.tipos.add( Tipo.LAJE_VIGAS.toString( ) );
		this.tipos.add( Tipo.SAPATA.toString( ) );
		ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, tipos );

		this.cbTipo.setAdapter( adapter );
	}

	private void mudaTela ( )
	{
		this.cbTipo.setOnItemSelectedListener( new OnItemSelectedListener( ) {

			public void onItemSelected ( AdapterView< ? > arg0 , View v , int position , long id )
			{
				if ( tipos.get( position ) == Tipo.SAPATA.toString( ) )
					sapata( );
				else
					laje_Vigas( );
			}

			public void onNothingSelected ( AdapterView< ? > arg0 )
			{
			}
		} );
	}

	private void laje_Vigas ( )
	{
		lbCampo1.setText( "Largura: " );
		txtCampo1.setEnabled( true );
		lbCampo2.setText( "Comprimento: " );
		lbCampo3.setText( "Espessura: " );
	}

	private void sapata ( )
	{
		txtCampo1.setEnabled( false );
		txtCampo1.setText( "3.14" );
		lbCampo1.setText( "PI: " );
		lbCampo2.setText( "Raio2: " );
		lbCampo3.setText( "Altura: " );
	}

	private void salva ( )
	{
		final String nome = this.txtNomeCliente.getText( ).toString( );
		final Cliente cliente = new Banco( ).getCliente( this, nome );

		if ( cliente != null )
		{
			this.date = AndrettaUtil.toString( new Date( ) );

			final Tipo tipo = Tipo.valueOf( this.cbTipo.getSelectedItemPosition( ) );

			final Double txtCampo1 = getCampo( this.txtCampo1 );
			final Double txtCampo2 = getCampo( this.txtCampo2 );
			final Double txtCampo3 = getCampo( this.txtCampo3 );
			final String traco = this.txtTraco.getText( ).toString( );
			final int enviado = 0;

			final Double valor = getCampo( this.txtValor );

			if ( new Banco( ).salvaPedido( this, new Pedido( id, date, tipo, txtCampo1, txtCampo2, txtCampo3, traco, valor, enviado, cliente ) ) )
				novoItem( );
		}
		else
			new Banco( ).mensagem( this, "Erro", "Selecione um Cliente para o Pedido!" );
	}

	private Double getCampo ( EditText campo )
	{
		return Double.parseDouble( campo.getText( ).toString( ).trim( ) == "" ? "0" : campo.getText( ).toString( ).trim( ) );
	}

	private void novoItem ( )
	{
		this.id = 0;
		this.cliente = null;
		this.txtNomeCliente.setText( "" );
		this.txtCampo1.setText( "" );
		this.txtCampo2.setText( "" );
		this.txtCampo3.setText( "" );
		this.lbTotalPedido.setText( "" );
		this.txtTraco.setText( "" );
		this.txtValor.setText( "" );
	}

	private void selecionaCliente ( )
	{
		this.txtNomeCliente.setOnItemClickListener( new OnItemClickListener( ) {

			public void onItemClick ( AdapterView< ? > adapter , View view , int position , long id )
			{
				procuraCliente( );
			}

		} );

	}

	private void procuraCliente ( )
	{
		final String nome = this.txtNomeCliente.getText( ).toString( );
		final Cliente cliente = new Banco( ).getCliente( this, nome );

		if ( cliente != null )
		{
			this.cliente = cliente;
			this.txtNomeCliente.setText( cliente.getNome( ) );
			this.lbTelefone.setText( cliente.getTelefone( ) );
			this.lbCidade.setText( cliente.getCidade( ).getNome( ) );
		}
	}

}
